package com.jt.handler;

import com.jt.pojo.User;
import com.jt.util.CookieUtil;
import com.jt.util.ObjectMapperUtil;
import com.jt.util.UserThreadLocal;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import redis.clients.jedis.JedisCluster;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Component
public class UserInterceptor implements HandlerInterceptor {

    private static final String Ticket = "JT_TICKET";
    private static final String JtUser = "JT_USER";

    @Autowired
    private JedisCluster jedisCluster;

    /**
     *  实现pre的方法
     *  返回值说明:
     *          return  false 表示拦截 需要配合重定向一齐使用
     *          return  ture  表示放行
     *  需求1: 如果用户没有登录,则重定向到系统登录页面
     *  判断条件: 如何判断用户是否登录.  1.检查Cookie中是否有记录   2.Redis中是否有记录.
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        Cookie cookie = CookieUtil.getCookieName(Ticket, request);
        if (cookie!=null){  //如果不为空，用户可能已经登录
            String ticket = cookie.getValue();   //cookie中存的是redis的 key
            if (jedisCluster.exists(ticket)){
                //如果redis中的数据存在，则表示用户以及登录，可以放行
                //获取真实的用户信息
                String userJSON = jedisCluster.get(ticket);
                //将JSON转对象
                User user = ObjectMapperUtil.toObject(userJSON, User.class);
                request.setAttribute(JtUser,user);
                //利用threadLocal方式存储数据
                UserThreadLocal.set(user);
                return true;
            }else {
               //如果cookie中的记录与redis的数据不一致，就应该删除cookie中的数据
                CookieUtil.deleteCookie(Ticket,"/","jt.com",response);
            }
        }
        response.sendRedirect("/user/login");
        return false;
    }

    //实现数据移除
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
                                Exception ex) throws Exception {
        UserThreadLocal.remove();
    }
}
